﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ServiceSATT;
using ApplicationContext;

namespace UI_SATT
{
    public partial class FrmNuevoTorneo : Form, IListadoEventos, IListadoTorneos, IInterfazTorneo, IListadoCategorias
    {
        string ImplementaEventos = "EventoService";
        string ImplementaCategorias = "CategoriaService";
        string ImplementaTorneos = "TorneoService";
        IEventoService eventoService;
        ITorneoService torneoService;
        ICategoriaService categoriaService;
        string[][] ListaDeTorneos;
        string Accion;
        int IdTorneoActual;
        public FrmNuevoTorneo(string _accion)
        {
            InitializeComponent();
            Accion = _accion;
        }

        private void FrmNuevoTorneo_Load(object sender, EventArgs e)
        {
            eventoService = (IEventoService)AppContext.Instance.GetObject(ImplementaEventos);
            eventoService.Listar(this);
            categoriaService = (ICategoriaService)AppContext.Instance.GetObject(ImplementaCategorias);
            categoriaService.Lista(this);
            torneoService = (ITorneoService)AppContext.Instance.GetObject(ImplementaTorneos);
            if (Accion == "Nuevo")
            {
                cmbTorneos.Visible = false;
                lblTorneos.Visible = false;
            }
        }

        #region Miembros de IListadoEventos

        public List<string> ListaEventos
        {
            set 
            { 
                CboListaEventos.DataSource = value;
                CboListaEventos.SelectedIndex = -1;
            }
        }

        #endregion

        private void CboListaEventos_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (Accion == "Nuevo")
            {
                gbDatos.Enabled = true;
                cmbEstado.SelectedIndex = 0;
            }
            else
                torneoService.Listar(this);
        }

        private void cmbTorneos_SelectionChangeCommitted(object sender, EventArgs e)
        {
            if (CboListaEventos.SelectedIndex > -1)
            {
                if (cmbTorneos.Items.Count > 0)
                    cmbTorneos.Items.Clear();
                gbDatos.Enabled = true;
                cmbEstado.SelectedIndex = 0;
                string Sexo = ListaDeTorneos[CboListaEventos.SelectedIndex][2];
                switch (Sexo)
                {
                    case "Masculino":
                        RdbMasculino.Checked = true;
                        break;
                    case "Femenino":
                        RdbFemenino.Checked = true;
                        break;
                    case "Mixto":
                        rbnMixto.Checked = true;
                        break;
                }
                CboListaCategorias.SelectedItem = ListaDeTorneos[CboListaEventos.SelectedIndex][0];
                string Tipo = ListaDeTorneos[CboListaEventos.SelectedIndex][1];
                if (Tipo == "Single")
                    RdbSingle.Checked = true;
                else
                    RdbDoble.Checked = true;
                torneoService.Buscar(this);
            }
            else
                MessageBox.Show("Debe elegir el evento al que pertenece el torneo antes de continuar.");
        }

        #region Miembros de IInterfazTorneo

        public int IdTorneo
        {
            get
            {
                return IdTorneoActual;
            }
            set
            {
                IdTorneoActual = value;
            }
        }

        string IInterfazTorneo.Evento
        {
            get
            {
                return CboListaEventos.SelectedItem.ToString();
            }
            set
            {
                throw new NotImplementedException();
            }
        }

        public DateTime FechaInicio
        {
            get
            {
                return DtpInicioTorneo.Value;
            }
            set
            {
                DtpInicioTorneo.Value = value;
            }
        }

        public DateTime FechaFin
        {
            get
            {
                return DtpFinTorneo.Value;
            }
            set
            {
                DtpFinTorneo.Value = value;
            }
        }

        public DateTime FechaInicioInscripcion
        {
            get
            {
                return DtpInicioInscripcion.Value;
            }
            set
            {
                DtpInicioInscripcion.Value = value;
            }
        }

        public DateTime FechaFinInscripcion
        {
            get
            {
                return DtpFinInscripcion.Value;
            }
            set
            {
                DtpFinInscripcion.Value = value;
            }
        }

        public string Tipo
        {
            get
            {
                if (RdbSingle.Checked)
                    return "Single";
                else
                    return "Double";
            }
            set
            {
                if (value == "Single")
                    RdbSingle.Checked = true;
                else
                    RdbDoble.Checked = true;
            }
        }

        public int Cupo
        {
            get
            {
                if (txtCupo.Text != "")
                    return int.Parse(txtCupo.Text);
                else
                    return 0;
            }
            set
            {
                txtCupo.Text = value.ToString();
            }
        }

        public string Categoria
        {
            get
            {
                return CboListaCategorias.SelectedItem.ToString();
            }
            set
            {
                CboListaCategorias.SelectedItem = value;
            }
        }

        public string Sexo
        {
            get
            {
                if (RdbMasculino.Checked)
                    return "Masculino";
                else if (RdbFemenino.Checked)
                    return "Femenino";
                else
                    return "Mixto";
            }
            set
            {
                if (value == "Masculino")
                    RdbMasculino.Checked = true;
                else if (value == "Femenino")
                    RdbFemenino.Checked = true;
                else
                    rbnMixto.Checked = true;
            }
        }

        public string Estado
        {
            get
            {
                return cmbEstado.SelectedItem.ToString();
            }
            set
            {
                cmbEstado.SelectedItem = value;
            }
        }

        #endregion

        private void cmbEstado_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void CboListaCategorias_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void cmbTorneos_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void CboListaEventos_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.Handled = true;
        }

        private void BtnAceptar_Click(object sender, EventArgs e)
        {
            if (gbDatos.Enabled)
            {
                if (Accion == "Nuevo")
                {
                    if (CboListaCategorias.SelectedIndex > -1 && (rbnMixto.Checked || RdbFemenino.Checked || RdbMasculino.Checked) && (RdbSingle.Checked || RdbDoble.Checked))
                    {
                        torneoService.Agregar(this);
                        this.LimpiarCampos();
                        this.DialogResult = DialogResult.OK;
                    }
                    else
                        MessageBox.Show("Debe seleccionar, por lo menos, una categoria, un nombre, tipo y sexo del evento."); 
                }
                else
                {
                    if (CboListaCategorias.SelectedIndex > -1 && (rbnMixto.Checked || RdbFemenino.Checked || RdbMasculino.Checked) && (RdbSingle.Checked || RdbDoble.Checked))
                    {
                        torneoService.Modificar(this);
                        this.LimpiarCampos();
                        this.DialogResult = DialogResult.OK;
                    }
                    else
                        MessageBox.Show("Debe seleccionar, por lo menos, una categoria, un nombre, tipo y sexo del evento."); 
                }
            }
        }

        private void LimpiarCampos()
        {
            CboListaEventos.SelectedIndex = -1;
            if (cmbTorneos.Visible)
                cmbTorneos.SelectedIndex = -1;
            CboListaCategorias.SelectedIndex = -1;
            DtpFinInscripcion.Value = DateTime.Now;
            DtpFinTorneo.Value = DateTime.Now;
            DtpInicioInscripcion.Value = DateTime.Now;
            DtpInicioTorneo.Value = DateTime.Now;
            txtCupo.Text = "";
            cmbEstado.SelectedIndex = -1;
            rbnMixto.Checked = false;
            RdbDoble.Checked = false;
            RdbFemenino.Checked = false;
            RdbMasculino.Checked = false;
            RdbSingle.Checked = false;
            gbDatos.Enabled = false;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.Cancel;
            GC.Collect();
            GC.WaitForPendingFinalizers();
            this.Close();
        }

        private void txtCupo_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsNumber(e.KeyChar) || e.KeyChar == 8)
                e.Handled = false;
            else
                e.Handled = true;
        }

        #region Miembros de IListadoCategorias

        public List<string> Lista
        {
            set 
            { 
                CboListaCategorias.DataSource = value;
                CboListaCategorias.SelectedIndex = -1;
            }
        }

        #endregion

        #region Miembros de IListadoTorneos

        string IListadoTorneos.Evento
        {
            get { return CboListaEventos.SelectedItem.ToString(); }
        }

        public string[][] ListaTorneos
        {
            set
            {
                ListaDeTorneos = value;
                if (cmbTorneos.Items.Count > 0)
                    cmbTorneos.Items.Clear();
                foreach (string[] Valor in value)
                {
                    cmbTorneos.Items.Add(Valor[0] + ", " + Valor[1] + ", " + Valor[2]);
                }
                cmbTorneos.Visible = true;
                lblTorneos.Visible = true;
                cmbTorneos.SelectedIndex = -1;
            }
        }

        #endregion

        private void FrmNuevoTorneo_FormClosing(object sender, FormClosingEventArgs e)
        {
            this.Dispose();
        }
    }
}
